using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Samples.ServiceHosting.StorageClient;

namespace KlearStorage
{
    public interface IPersister
    {
        TRow SelectById<TRow>(Guid id)
            where TRow : UniversalEntity;

        TRow SelectByPartitionKey<TRow>(string key)
            where TRow : TableStorageEntity;

        TRow SelectByRowKey<TRow>(string key)
            where TRow : TableStorageEntity;

        TRow SelectByKey<TRow>(string partitionKey, string rowKey)
            where TRow : TableStorageEntity;

        TRow SelectSingleOrDefault<TRow>(Func<IQueryable<TRow>, IQueryable<TRow>> whereClause)
            where TRow : TableStorageEntity;

        IList<TRow> SelectAll<TRow>()
            where TRow : TableStorageEntity;

        IList<TRow> Select<TRow>(Func<IQueryable<TRow>, IQueryable<TRow>> whereClause)
            where TRow : TableStorageEntity;

        void Insert<TRow>(params TRow[] rows)
            where TRow : TableStorageEntity;

        void Insert<TRow>(IList<TRow> rows)
            where TRow : TableStorageEntity;

        void Update<TRow>(params TRow[] rows)
            where TRow : TableStorageEntity;

        void Update<TRow>(IList<TRow> rows)
            where TRow : TableStorageEntity;

        void InsertOrUpdate<TRow>(params TRow[] rows)
            where TRow : TableStorageEntity;

        void InsertOrUpdate<TRow>(IList<TRow> rows)
            where TRow : TableStorageEntity;

        void DeleteAll<TRow>()
            where TRow : TableStorageEntity;

        void Delete<TRow>(TRow row)
            where TRow : TableStorageEntity;

        void Delete<TRow>(Func<IQueryable<TRow>, IQueryable<TRow>> whereClause, bool single)
            where TRow : TableStorageEntity;
    }
}